package com.yt.sys.models.dto;

import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.yt.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

@Data
@TableName("permission")
@ApiModel(value="权限信息对象", description="权限信息对象")
public class PermissionDTO extends BaseDTO implements Serializable {

    /**
     * 权限ID（主键），使用String类型以支持varchar类型的权限ID
     */
    @TableId(value = "id")
    @ApiModelProperty(value = "权限ID（主键）")
    private String permissionId;

    @ApiModelProperty(value = "权限名称（如：查看账单、修改账户）")
    private String permissionName;
    @ApiModelProperty(value = "权限编码（唯一标识，如：bill:view、account:edit）")
    private String permissionCode;
    @ApiModelProperty(value = "权限类型（1-菜单权限，2-按钮权限）")
    private Integer type;
    @ApiModelProperty(value = "权限对应接口/页面路径（如：/api/bill/list）")
    private String url;
    @ApiModelProperty(value = "权限状态（0-禁用，1-启用）")
    private Integer status;
    
    /**
     * 使用transient关键字隐藏父类的id字段，并使用注解标记为不存在于数据库中
     */
    @TableField(exist = false)
    private transient Long id;
    
    /**
     * 排除父类中的revision字段映射，因为permission表中无此字段
     */
    @TableField(exist = false)
    private Integer revision;
    
    /**
     * Getter方法，返回String类型的权限ID
     * @return 权限ID
     */
    public String getPermissionId() {
        return permissionId;
    }
    
    /**
     * Setter方法，设置String类型的权限ID
     * @param permissionId 权限ID
     */
    public void setPermissionId(String permissionId) {
        this.permissionId = permissionId;
    }
    
    /**
     * 覆盖父类getId方法，返回permissionId的值（转换为Long）
     * 注意：如果permissionId包含非数字字符，将返回null
     * @return 权限ID（Long类型）
     */
    @Override
    @JSONField(serialize = false)
    public Long getId() {
        if (permissionId == null) {
            return null;
        }
        try {
            return Long.valueOf(permissionId);
        } catch (NumberFormatException e) {
            // 如果permissionId不是纯数字格式，返回null
            return null;
        }
    }
    
    /**
     * 覆盖父类setId方法，将Long类型的ID转换为String类型存储到permissionId中
     * @param id ID值
     */
    @Override
    public void setId(Long id) {
        this.permissionId = id != null ? String.valueOf(id) : null;
    }
    
    /**
     * 获取用于数据库操作的主键值（String类型）
     * @return 权限ID（String类型）
     */
    @JSONField(serialize = false)
    public String getPrimaryKey() {
        return permissionId;
    }
}